package com.anjia.unidbgserver.service.fen;

import com.anjia.unidbgserver.config.UnidbgProperties;
import com.anjia.unidbgserver.utils.Base64;
import com.anjia.unidbgserver.utils.TempFileUtils;
import com.github.unidbg.*;
import com.github.unidbg.arm.backend.DynarmicFactory;
import com.github.unidbg.arm.backend.Unicorn2Factory;
import com.github.unidbg.file.FileResult;
import com.github.unidbg.file.IOResolver;
import com.github.unidbg.linux.android.*;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.linux.file.ByteArrayFileIO;
import com.github.unidbg.memory.Memory;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Random;

@Slf4j
public class FenEncryptService extends AbstractJni implements IOResolver {
    @Override
    public FileResult resolve(Emulator emulator, String pathname, int oflags) {
        System.out.println("file open:" + pathname);
        if (pathname.equals("/proc/stat")) {
            String stat = "cpu  1209192 278928 2191380 5564335 69710 164500 158299 0 0 0\n" +
                "cpu0 272080 47122 771336 5564279 69710 83363 88819 0 0 0\n" +
                "cpu1 278487 47788 509493 7 0 26776 22452 0 0 0\n" +
                "cpu2 306880 43295 389021 7 0 22909 20684 0 0 0\n" +
                "cpu3 174831 20941 318552 5 0 25036 22103 0 0 0\n" +
                "cpu4 58459 36080 51694 9 0 1919 1318 0 0 0\n" +
                "cpu5 51073 31143 41167 9 0 1674 1224 0 0 0\n" +
                "cpu6 38577 28601 34271 9 0 1461 897 0 0 0\n" +
                "cpu7 28805 23958 75846 7 0 1358 799 0 0 0\n" +
                "intr 155705479 0 0 0 0 17366157 0 2541200 151140 0 0 0 0 3160250 0 77 0 217647 15455 43218 3574258 0 2 0 0 0 1853 658 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 1845 0 136 0 0 0 0 0 0 637834 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 378 0 0 0 0 0 0 0 23 10518882 224481 20256 12683 779304 486 0 15 348 0 18 835077 1931888 740831 0 0 0 0 0 196172 382972 2904068 0 0 0 0 0 2858 0 0 0 0 0 0 0 0 0 0 0 0 111870 0 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 5 4 4 0 0 0 1395 0 1 0 2 0 2 0 2 1 0 0 2 79 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 41 0 0 2 12160 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 123625 11100 0 0 0 0 0 0 1 0 63 0 0 18 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1827 2399 0 120 379 1322 0 129 0 0 0 0 0 0 0 2 0 0 0 0 0 206 3 37 0 3 583 3003 11 0 0 0 0 0 0 0 0 1186 0 1259 94 21509 0 940 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 13 0 0 286 3 0 4 7 0 0 0 0 12 0 0 600507 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n" +
                "ctxt 303843631\n" +
                "btime 1654535232\n" +
                "processes 121585\n" +
                "procs_running 5\n" +
                "procs_blocked 0\n" +
                "softirq 52763266 11220442 11237397 669917 1413834 3167347 0 6287292 9643900 0 9123137";
            return FileResult.success(new ByteArrayFileIO(oflags, pathname, stat.getBytes()));
        }

        if (pathname.equals("/dev/urandom")) {
            int length = 10; // 随机字符串的长度
            String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; // 字符集

            StringBuilder stringBuilder = new StringBuilder(length);
            Random random = new Random();

            // 生成随机字符串
            for (int i = 0; i < length; i++) {
                int index = random.nextInt(characters.length());
                char randomChar = characters.charAt(index);
                stringBuilder.append(randomChar);
            }
            String randomString = stringBuilder.toString();
            System.out.println("randomString-->" + randomString);
            return FileResult.success(new ByteArrayFileIO(oflags, pathname, randomString.getBytes()));
        }
        return null;
    }

    private final AndroidEmulator emulator;
    private final VM vm;

    private final DvmClass FenEncryptUtils;

    private final static String TT_ENCRYPT_LIB_PATH = "data/apks/so/95分_2.77.3.apk";
    private final Boolean DEBUG_FLAG;

    @SneakyThrows
    FenEncryptService(UnidbgProperties unidbgProperties) {
        DEBUG_FLAG = unidbgProperties.isVerbose();
        // 创建模拟器实例，要模拟32位或者64位，在这里区分
        EmulatorBuilder<AndroidEmulator> builder = AndroidEmulatorBuilder
            .for64Bit()
            .addBackendFactory(new Unicorn2Factory(true));

        // 动态引擎
        if (unidbgProperties.isDynarmic()) {
            builder.addBackendFactory(new DynarmicFactory(true));
        }
        emulator = builder.build();
        // 模拟器的内存操作接口
        final Memory memory = emulator.getMemory();
        // 设置系统类库解析
        memory.setLibraryResolver(new AndroidResolver(23));
        vm = emulator.createDalvikVM(TempFileUtils.getTempFile(TT_ENCRYPT_LIB_PATH));
        vm.setJni(this);
        DalvikModule dm = vm.loadLibrary("dusanwa", true);

        emulator.getSyscallHandler().addIOResolver(this);
        emulator.getSyscallHandler().setEnableThreadDispatcher(true);
        // 创建Android虚拟机
//        vm = emulator.createDalvikVM();
        // 设置是否打印Jni调用细节
        vm.setVerbose(unidbgProperties.isVerbose());
        // 加载libttEncrypt.so到unicorn虚拟内存，加载成功以后会默认调用init_array等函数
//        DalvikModule dm = vm.loadLibrary(TempFileUtils.getTempFile(TT_ENCRYPT_LIB_PATH), false);

        // 手动执行JNI_OnLoad函数
        dm.callJNI_OnLoad(emulator);
        // 加载好的libttEncrypt.so对应为一个模块
//        module = dm.getModule();

        SystemPropertyHook systemPropertyHook = new SystemPropertyHook(emulator);
        systemPropertyHook.setPropertyProvider(new SystemPropertyProvider() {
            @Override
            public String getProperty(String key) {
                System.out.println("lilac systemkey:" + key);
                switch (key) {
                    case "ro.kernel.qemu": {
                        return "0";
                    }
                    case "libc.debug.malloc": {
                        return "0";
                    }
                    default:
                        return "";
                }
            }
        });
        memory.addHookListener(systemPropertyHook);


        FenEncryptUtils = vm.resolveClass("com.shizhuang.dusanwa.main.SwSdk");
        dm.callJNI_OnLoad(emulator);
    }

    public void destroy() throws IOException {
        emulator.close();
        if (DEBUG_FLAG) {
            log.info("destroy");
        }
    }

    public String heracles(String base64String) {
//        String base64String = "24lFjk8mxNmCbeLwcXNl8fsMkLX8AOA90bbD3RUXtnUfjVDjveDm0YfPSSpayvFaltEMk2tymfh969Jk1ddRWRFvBea6TwyrrTGOiZ81aNcJ_4fk4hs-jNWZMUeTOtAD0FR0T78YqwBa6RYecKT6bZIj6JnK_VtRvPxz2SPvZ0_55Dl6bt1a6EAd671wNOpWR2DlkcF7q1zffjjLW9IPcQHYajIhoUUVy-r2qJglS0tCNkPv2ICk-53iVnfIkewk_la_0vYZmzc_2KScN9rqiZKYfjLht3MMyYJ1k8f-jdBDKbY5ZasA6XZoEKYWFRdT3zyd-YVGIhZ0D0J7Ii5YfGqRzB-oe_I14TggziuSQLFHmUyRqFE_RYEOiDSj4YASI6W9EPnfGNnvjg70k-2cdOc52vr92qydDWCLYP6O4g-Av0vxacp6L2df1zb3x7-ncE5ymxSbRZLFgF4WEtDGKdx8OgPldaexCONA0DqUTKQSpZGGHA0R42qPmRbIvV6KBMaztG2jFyUdTuTb1fF-W_ag-Fu8PnCcWXVeVnsOdzX2VWL5TKoY6B20OiIQowYfYM01uqYUzr60t6DzG3gw_OOR7DpwAwtt5RjbctFggRggYocYysD0lMUUP-r55VqD0hKMkmkBUOnI1DsZ9ZkV-pV7FM1rWMAku4g3h5R70HzPPkuhTl1mhHKmaTtfTImMd3-CoUmHkUWfuIAFGf_zEeiKcqzTxLpk3k9g7PXzT8ZLhfZJ3Yd7oB6jLccDlCyURozkRDwRAgaj0pkz3nWCvjhK2X39cvYki_0kIYhL_NhNhQMKCelz8gSw1Zk9wI2uUqQIMIDCwJcvJLQvX9hDh9ix6j7hHXN9YqUMd5iNqrO5Y6p2Z0l82FkZ_b7Xymnby9vCfRCia_YQzz3K38NT_IH594eN6EqnTQWjCxoIMwDO5V-WapsSbVxoIxXTL1RPtE3F7gyVLkxN4TBbDajzFEMWu_U6xKuxOE_f450AAA9AhbB3nNsagGynXcZBcUIwVQC-C8yPYevR8-vjAil-cT2h7-7BgpBSG74Ylj7Ir9rUIIgOwMAVhnvSB3m3keJoiluFOD2G9gMX_Ydst1fz_esH9d2GKbDFoN2M2MelVyxJBLNe3n57FPPzHHCHU6r_NtOMeVysTkans3aVsLCSdVsMcFIR32o3sJNxlWchrtb8892uhgKgAuKNvukuqLATKj9y0Hf8ihnPlfwIB_rJgtv6IM8oXbRLhaxVVuPlm3abW_uZ0F0faMaoegL3jGcgtikx0Cya1kxK_CVClZXDU_FebV0pPFPpVkwlPvxBRy6wY0ilBdg-Lre2kzug1GaOoNwgS36-1aZJJHVH6Gytpq2Nvj6zZVUTMq6c9198pCMYFr0Ipjc7o8esSDcIp3B3vzaTJfO23RQKYYxjNf9g9rD83gFCzdztiGJi2niLeUUaP7iE-inwosJtFMB1iw_38XKAPJD4RVxQGw-G-QGyzNLDRslIILE9vLmVScJcfJMzES727qDR95OKK3ePUNzD2scJeeFIHviAKQydOXmn6n7mWuU_OyME2qv7pkV-Yj7juxAbdkM9EYNxsFzNGQUF1JlhGzNqotNTqCSZ5y7GqFRIJCWyydGyK7DAPrEBpVumhebg8zimuRQi5qIIeaB2vr1KPLVLHY91MVyE4MbG06xAbho_8YyJDdBa4d1Fo8wXDwjaStuMtFEzY5uI8MpbTOzwYoFsfA9dsZ3oNI5oK2ttM6NSGf5ul6-EYcao0_XoCZ96kYghQQXZEWgJg1NH-8I3gzOUz3r9k-Ap6JnmjqHhHaQfLc3ROTVu1gDry4QO0xZvG5ydbVxRZhubJHZLHi3ZXMq7JWVOpxZE_Wxgccq7mBitfcHevO8kQNSFriGzgSZl2ZDKrJaYQ-7fm5kFe54PUARk7JP81VjHbPAECwbHXU0wnFppJ5FN9if3-uO2Ahl3i_DLE3LuFCHNVmosS29K68qZr3V543rni-oivhcwm5ku1x2CtuhLOh_X4SWfLylpAGh4eMb6xLGr_Tlgltts7slCTBRMHlZm1iLPUxxothzDCIcrRkLG6-NA8wBnnrmk6VwyZHr4nlgtYgC3GQvfF19DVoQ6rAeXs2YMlG7DySMQi76al51rrnSt9QYboRETm3gtPy7y1pP89CNh5I82SiCdHIp0ZbgRMRz2JBvjhhLWZkiMyNF9XjItDWAqJZOwNOEL7AkMmEcwHZN2frM3_RKlxtpfidTygfU046RdwxVMmY8NAOj7E8K2F-hoNUMbF5vMVzqY-nS6FPqQAxOhpThvsmkIbryaebOuSeWgvA9QjtoBQ2jGNqIyfBnMom7P7SeisfxA_HkCCOBl8_FeCy7QkNrR_3fdBqPqGKSayFeVO8GTeuVQq7Myor3-Gc6lRPBo0ZOMaCRJQvpZVXSL663XNKwsG7kLg_KFjzCpjCNLEbjL2GczjtQATAQkiUU5uXOrMd911t7Nea4pK60kn9lZVctoInRKPizH-g2U3R-HvbGC30iPnzFcpZUc3-g1HbSlFYf2kL4prsOP0AGN5G7b84H1L-C08mK0mZyJH5bTTrTDERDGyDTvr6zIVwWJx4T7_IJNCNMqRXiD-aA0YDPZ1hrMLs62lKz4_wkPl43q5MMU0AvziXwIFIya-CC4RZMxCtMR0AdnX87aEj0gdnw0Wav2eBXOeyumh15UpM2zDwzQiA-g38klh2AicqB6x1N5kDzmoIAamNuHp-Wbmd30kGFdNfUbNYupKdwTcvgSyTI7QJ5hQCrvayewiqDTD0Pkg8F8SltfTpNapoIuWFwfG9L62nDVyrJYTuXHYfxVAbxYfsGMH19YuwXpa5qgQmoZ1lGAMIkjCL11pU5MS5pqpsE8AVOzfjlb94uzKsP6nMvJW_41NhbnJxDreMOCk6qYDUxjSZbSayy9bGW5T4JUFZAcz8LjZV2r1tc8vU8cl08NZYZOLinFdZAixFPvr08QK622Gxqw0lu4DOmRAtjpeqDqYHBEM7xnRx00y_LmfnovDnnjIJh-xPvbuobLr78kFMjNY3dJ1jXTicCX3qmjCCO-zDa3Zt83VvHrkRmL_b-dRNL-jrtr3yG2aVluWck2a2sChWSlh4RaJqOIzSwkApQvA3yIqe6TfDA9uEH_WRIoAsthOwJwADfFHoyxFJq4LrOkR0Wk96vxtddIxuLwzzl8QkPWYRmFS8dlWVtxplD-A2kpVh8u4wRCcR725ILRoFB-TCJAWRVdvifi5h16eKysOY7jmVV_kFKAGunJ0QA2KA8vhdmtifrhxZVIdxYe1TrJriFikp8jQlABfqOrGvh-1X1ghbBVmZWwm4u_r_LpaQ5uRMt0H9InLT8au7wtYjnV9tW1w_GUIu3BBCZ0wmo8u3V89r33wBHuHMWmf8lfrnji-BEHVb-jYGEso7a4qth3OAMKAKHyj0Fu0eDGMDtB4h8FCBD0pOPorOskKKeRsiSjjhAPfvTNhnpZsoHrizGWzTnEy_zTWe8ZjxUNsfWHP87a-jHIUKGsM5XMtgUk9_ggp7L9Pfu_WsmybKN5REC8qb-322aHkgM0rLpVjKd9xpuOJ1zd16922nBLvUyAMUP0nKI_UUr3nWJbGTxtPg3W6N_iQOJuPA52ivNcnaoIoE7wZAR5ebk8dh0hNMTYAYSZPiBJe3B5S-VDJqBt7eQmc4kfZgB43sITd3719lTwBH_H-xQRxOU0Omwtu6HGpyKVUW0RRmFcOGU8TRlE2m5yYspaNT4sjd3lub0u_G-J7eFKaZgm1n9Ah71BldHo15Bu9QypnjIjENQYyiOw1yFjd_PgOWkNRMJlp8inEPsUCxZhN9BpeF0T2_9EBYputWHOKZFdrTXgsSVbsT3Sn4gQ-Xo4gSIC4fFtCPXy__Uq5DtQRdpT-9SJhcPzLgcUQtPFHGf3nLZl1HjAvPwvYe33vdmAG949C8PNI_YYB_mhwXRu6DyjnB5M4gt6Au9vFxqWpAQqK6Ldt8RJZeJ7HLyO_cvghI93bkSW5Ka1ZUddSbzEy_0XpV8px4RcxwmjMqGaCvZbGvU3Y0KLMVOkl6tANUbkQ1LKanOdIrF-rA2dSFgQY5Egc593fafy8ryt-FdQjGOhJMLhNQaFBbnReGitOHgGPCXl5mtYkqPxb93rUY2hnwitOvBVRs7aQw_O6L1C1GMX7I4Cbyu0IexKS5IZwH-8fFqo4n2SjPmPx0eM7zbudBrJfFKOK7YnkBQ0UvbGwHdu8P3We7H1X7mtenFHl5e90puLYfRLx_AQve7qeRzyOKzvJyikBsZg4n05twn6YmbpVsF_3JMVWEWoFC-LsOLEMoabSeItOJRx3rqrD3Aw89dKIruWjPX6BrsdWJ0d26Os6LyxxgpkO6w70kJwZtk3YYveQod9MzEOcLsYiXk2PB75vfgAJFKc_4I8ClA5j5yymftvQIFC7Fi7oux-fI4GME-LI8wVR11Ch0G_OPWSpKDqGZ3djPKf8m6XvjD7hErz1O5v9PII7suzvSVB2x9Lb9zLSRWv73_Zq0gogP_1a5o078LTWMYGBOuihnr-CJWHkbXNuF-U2TergxAATJk56NwKkKJM3C0xGqSuooFp2-SF1vedTxZnMaM-8-h9Z8cnI5AuBf7vVZvhRjTaNu92PTSSwYgCYvqe7W--XnfpE0n0IGrNr9Ubs13EWjlMiAy_BLFcVUJNssV083fPmnDYo_JR4r5w-lmwViTnbMIzn-D7a9-rzKM8Udh2fIORcafBYJfaLLAQr6ahy00jRy7vyvWEMCDcHrOHIjvxDwpzjcRR59iEBkHlCetleoXloCBhVq9MQvi5rsobncjFlPHxVWC8bR4ccZE8-NrO7GXlc9zl1D8YuOfmeIp8f8JJuj3hNWcbIidYHWVz1OVMBAZSeTBxHOhzuv8TRfEx5uG_E5j4Mxdu3joCtbbd6lc_3b6QqgsyMEm4-xNmUBCwZrFl4ZzJGkw-6UUL3SrZ6MbYT7yMeYeu8Bsrbpwt94obj_fHfBAzJCeJjqa8R2mRTIpKrHuOOUbtCH_lyqjwJNhxpCYvvItIdo7m9mS_fadELwRw6fnGmU8PFgXJd3Qe6w-WyQ2MYdOntBNjYUuJC8r6_s77pHarUFsYPompTZeDnQLWchSOPt8NLPcLMXgbwLQOzCFHaDesJ8szqh9Dg3D8_K-ZfpUhNAoRvYu_zL5ZgacGqa1spQtYF3zPITOpqiXM9a_cFhX5-1o8Y-yPHYhhTz7O42b7mDX4uoYzCkUcnb-VDhTwCDPiJx5a4n-hyl1poc0UwlG6CnXcqkSmEEsWh78-MRZnMldQXmhQ81nBbDQAJy2GT4lNeFld2nJMEVYnkSKeqRg54fBwuURMpgTybvclCJkbpWTMLK3Sk4xPJkqXx167AXYWIEI4saRjxi2YTkxhyJVSL9i8pV4YGJl1xQgzV03WEdJzQtFj8CZQPyeIBT0XJCHeLp0BlQp8vXqX5ub249iPY3uwIdJHUDULbnN1-GPPXat15_3MKPIOb8RrJKwgjwy_r4koe01fMDpDQKnEXA8hBQxTCXs0LGPECFRTpITYbr5VmL91WjXaQUsxqLobbEBUrbP-3hLS6aSymlzxrsOupLMzlClqKENaMyBvrjl5E50ow8FHBT0_tGleHBxysMf2e_vHxYriTN3EVCzAAn6_DtaknEo3_Wva2sR03G91PQXnIvVi9vcqTHgwbEB8LoaToyfAHQhaqXyiymcbhgTsgMMbX3jhPRVpA9ycP3eBYkJl28HXyvRHp_kNKWjrLgvzxFgLrv9UoDufqravePQX_lHNLdtFMEu4BvVh5wDdxaA4AFvSrHdK1FfwlcO-q94VbLho6usrJuZRwxfe19Z84zPKVYXZ4sYcad76AApFh-RrWq6QBvx2BWWWWIL2gBsEYl8BBx3K-MFJ7PWD6Sc3ZYSO9lSyXbBcVn38odUW5XXNBMRMx2YRQ29V4TSLqoquGpAnXV-Kkuw2aehzuO1cAPy-P18dS98e2tndPFpJsgFXDCYDGVpRILikO0H8DALZdiugQtPEemfzHfZDD1v52St22Jg0kmzSVNbP6y6z4QyRp5HKhZb6-1HkpDhKQAm5xQrwS8T4Bey4eoU6wymJ6mQlIgh2gQFPn6_m8Q5zYMBgZGehZ58zfbh8yzBavXCk2ALhDu0wfnfa3_x3vX5tq82Ov2SdrlswTyG5yq0Sd_fi8Ws6fN57bkinf1EZwXaIzceAtesOUbQs0SFSiDjenliQeXM4RL-DYZbXujypPDHpIO55V3z5X47utpWgq5CGYUj96GRhSzIewVG47q_uRiWI5n0W7XzEyqhtfDcgXKKnFVWS63xrBDzBk-7ckE00khQVNYA8l3_wFG4MVQVONvCqYTytsJQI2f7NUEQc44zZvhr99NA6yPhxE6CZ2SN-pQbkDsXAvXBfkxMmBlbBL7YQegm9v-S8xGgl8mdUHJtFFT9xCz59HNnIs550Tvx6sHtekgH87f4JbqfWYK7A3ORQCBoRz_ozYLQDdjhwr7fHewhwY1lSUFvHTU2cVbMEEDdOSNbuRbOdlv4OCEls4orzIhX69HjT3wKuigtZpVnEaY-jpmO2kQrJ5d9MVyctjqgd-si1CNrKRkZIUGzXesKPxF76aatypl4HiEUnhrMZJvhpRw0d50CPXViEI5wclX7q5s9E7aMbKRRdumTlvY-2z9OGH0dL7Gh1c7nVaVprwoSU5NeNdvJszR7oFr-B5l1kFVfnBv7mxNY7zpmkCetq5BqP9gZJR_hCcfXoCij1xaL4pIPGJL_RsE8esMcpHdN-fRnIxSHnI8rciS4mmHNVC64gcLytvc7eq_vAWMbhz9qNcTOR4xh-n_cyddnLw8YnC9amLMaeU0YUKzrbn_bygtp-kKfm372oAf3GAhOLzXyF_v5kEhXIohUKEbNdrcI_slaPd0YWIckdeZtrQbRuC9fZBrTajLMR72P4kC4CstfKGRWBXlHK6qSm9MZmWZ5FKbU0iJatQC0NLD6WZccexay14IFx-oYvEMNKhrhBrDPsgTE352bAOx0IrzkYHhpOU0ulBpdbg6rjVpghm3pcyvW76q-omJgsMwf6UZCtG3W8ykNg60TnsZSsJVfRHLxPpnmrt-5kRSLFKDN0m6O4TaqRn1gfV1MvStvxq4CEYDzAKeUdINkfJKRv-oc--cq4STPvwz-lra2Qf6-xj-aRZ_Uv1rO1TB1H62LHuzamHHihGGT9T-WxwFgjL0fXlHA8PlHGmQmek794LXQgp_uck-BKfDIz3ikTF8X59igxxoTbxGMo3H2GLMf40SxbuDIrggJc65SXsv3MJiJZOOOxq3KVffiqlMZspO-KXlLhCnz6TatQqgyixclOxFip6d_3qi0lA2wVDphzJbq-1f3pB8TjynlVa-6vOeOksxygNJyNwgJEUzR4kco-ZEY8jYWwiF1sSykxseh1QHOUqEswoAr8rch9emag0A97thG8PnmH0n7w0CH75quXqedmjzZV_pzT0Yw_3ZWFzLdkM1P-Au2ZLqSvp4DcRxh0wfrxYn1lbjrk98OzZhtkmNE_EJAVuf7-hEetijD5h2CqPQtM_7KA8e9n_-Pgc4fyK_iLr_RI_r4xuvyKN1g8oakGZRzfcbBLh0i_mNgJOKkEzYIxCafbq_FFM64eUNwmGgD-aFGo2sCUhwdbloi9g69CYwovkYsK-oexHfFzK0iZcn-QVICwNXtLwUEbPLcau0Hh1pl1tEzO4cwl5UcXtQANtMTg3SmltBWkSdvtURQcyB0dp2eyvwt0uCacxL5u18egun000Cn_3vXZVI6q_Ryi9TMPQmiZpBOyfy8cpi3UlkUbqoyabRyASJ76VVlq7LZdHdA43ypPVFOZhHzg2GGIVRm6MUhIh8YYRe61TGAS612WKm5bZ6Vv3uSRe3sll_4fmleaWA4V8WmPUw7W-OCR3tpOvBfz38AFLTO4qtoQ3malPoN3gQtnl_D1G5XTKqPz2j9BgGuRTAZxHizZFjYaMT3DAvPblKCRNYDf5Gzf-0ZC9sxMfmfUV2X902FZuKkGnErqRWEilmmIDeuYp9iB5EkNI_Dq9XoZ4kn6hxee_AwMNkgRcZ8LahVerYktRzXg0DjOQIW_tnIK9Cc8DqCcR2JqDyA7unAyvnf_-rIQeqFZPc2RLQ_6p6Oo_Ry1cygA_FL8QapZqtHFEAyAJOQnm1cNbQWeV4sVIp6BAQTHUXHYY4BL4fP7wlAUWCB3uO2dXLRe0nkTYpZxOTmnle3xKOqJhpsXChPhTdmgLic984WmJBntiT8XvxrE9on0gkzgG00lgGWWoESkQR6RKTYr4AvAhDC2zevfqbZjVxxHITYsWg3Cb74H8amMBQHl7Hcp0iJXbQKBepCzVKTB_8Qtu0QsQhCs0ODmNaiWwuk56l9EWyGjaGhD-gQk2K99ZVMniBwziz9ryg3lrmN0pTWA0uBAMhdUEO7bGTYEAL-LTwrHtMg9-mjvsMDYzAjUc93J1N8WEdmh1FpRUB0RNuk_F5XPCsokr21iA46Vrw04ElsIP3PnMO7m5JHBgl7iLAgQE_Gkzcjwt76QUaRniVMUp2Ab4fErkFxy7u7JGlIMLirnqHUZ0RJn_Rml1aQDvDBlWuOhdcjr3JhT98RaLS7IdaSwupMv8BL6Z_nP8gGu2dQodv7bUTi4FAlTMctruNSBh2xJwrx1DezRdjmYIZdN0w_Q-gRZeEeYTlxsKxYy7I13aDs7p1pC3vo_0bayS0xCJweQ_Bj_7vgMJRbFyjXAw0oAif-Vpz8plokd7phrMyctuTdzxPQ2nIBLH9I2mTS68l9xYni3esLwFRSEqCZHqxLp9nIXZL8DDjXqjj2fZHgkQQfdABeW3I1-xHxdQo3vpaqjWpSCKeciTuKgO9VnOicITRT5gf4uJrLwNeehw4KdJve_TUtQNYqsIuNduefjiT3AVWqUAV3hhoE8LmXy-UHJXoYOeDUY03REXWAq3YWH2bh5pHMN4ANdE3NsmayeS4wjnFwebcFFJukm5_f8hKlVE8tPLkSg7SXT7yh2wkew6_VUZzqZXEQE5AF0PoghLycTpzyd5112Q4oz9d-44y1wb2V9PWT6bMB7DFLsX-q973MaH2htQWTLEHDYy2E9y0sD9wVms2S1lf_Q6kxB20jFWT7FvER3WevWFtdzHE0vVdyfRAIlnd_YKbxM9xkDkWMDMQxd086XNNatcZiEgk03Ga0oSsK7NhkA9QTbZeSoFEc33jawVZ72zIzJj9MzpIJE4BR3YXQzI-5zDrHoTU-bRKjENB4kvq_BAt7vvdUYpyZCwFpTprW2jgOGr0sZ5EqnLPYdzgk1c2enZW0dijyIlvwCWJjAe9XEmF2qyx35JEs1aCudmkvBVACBzeKhNvWiMT36Wf6vYMtK9ZH1okFbGYR4bWYCoAuBg_amUS5X6HWZP1VsoPlexC_NTpAUiMKaeTAHWFbbXe7MJUDr80X0O8FbCd91y_2Syq_7hPiyFRbRicv_FGHoQc8ornu0mX6ZGpZywMNRzM2vSSt2istf_uXibUsLsmFgp4AyJCY-G4vwscYteUXRlOKH5ywfpEj9ZATImTyVW4PX8DjjHpC1uZgPfVrXdh5OH7KP0zQCQZoJYr1V21yKnTokaUNCIZchkl3rvfhk2kN2jroOBWMOWeusCGdC19Yv6gHKB7uUe_G5MokFDLQ5t4nkXUihdGe5l1yoWMSHoKuXwCmj0convUKityW0YdgIzY8iL3idfx6iBWUtn_OmpFXHod-L0qWHb8owB775RU4msz0QMzB_bTUiiCNkWSOsZWRtuM29oXq2-XUWEWYmnkru2fAdI40JFdpU7AgQ2Cn-zQYH2VxaG_tPgVMPVk1Q9cbOzyabHfEBrrcqp8HPbkWtDnbIpoe3YpgGsso4aP3mLZMi46Ho1t11KDM2zLVJ3u-pFpOcIOuYl8uqItjmnzPeEt08nzs5FK15AusQ1gAuPi108ED_RXpon3NgI97ZplC_IfKeSboEh1JBRynDaV1pLt-9mmCwB76GZPPjcvZE3ssfzMBvPRyVowqNd1pd_WzIWe_v_N6frbWvhywNOOw2EXtkP0V9yuyxLTr4K0CECZKtTXEMQciIGKL65ddHKPU5LJUzYHxwFWh_FLV5xLMcMfiFLJp9ImxYYsSO6peY79K6KV3eTfqjXVYlweKqz6Op6-J7NsiBELZuGMnvG9qhLAVLDqk7eCCSWv0IXc-NfZ94jUeE1Am7Sb3gqjwx4Mzau8QOIBYk1LVZv2VgnldV5C14D2CTL8vYQB_8HMfg39Ys_CJLC1FMHq9eP1de1VpAmm_GiKnQ6yvXnRcgo6zudBJkS8ZhXwhQv6xNhdYdQTo0sZH8EEkjCLCc5Up7xX3LfPX40twoCD8ny3N8rFl0vlRh1jd6H1CXs7IOVvHdlPtF8zO5FxEpS2j_4HpXB1WQCyu56x5r84rTPpxaZSheg73oz75Y3I5H01Br2VhyI0bgIoV_Y66D7EgyUCiacPI1047wtdkShJXoC9iwFQutSQbk0RjC6olvqWudCSaZSuh-FE8MKeyDLXS5Q33fHmNlgZAm2ZwvE4x4cSY_Kkud4NvzxKGy_XcfXbZxlSqRgs3l300_NogWgBMm1QB9KeDO-8nMHSxx_Q4Y7G0o2tCSGu9-yGqxah7eS8V6k_SusUZHDML7KtbPR41DBjVihQju4lI8fNsR_zG23i1mWFHXmJZjcWXXBJRyyOwJbyYlt5XhvYuJ1vMmYMTjubnDVg1aKHTYRxNV4sGvT6A0OYkmJp6zN5Effhr3ji3jp7lZQQmGFgpIIKa4PMw5qkeJDLN4KlYn2OiExM9L6nXxIiVucsIyYzmGlmjYmNw3jvnsFhEKCHYVadsXsoP27d-FD08iYRALwrqUVssxxbgki9sFktt1oQcRZKyIrgScZxZZhoEXEnyfIzqycxOD4mjffGWrxOXEAZBfpcxnhhUNX6EtVavIgIdIoBEH849Di09WaFTcY1VsBKyJOM_D_iRPkwUhs_290-z9B9lNLw7etaWGN4QxihFlpPrlZXghiGRuU7tkNOVJTguyN93yF4RnSaRycVY3iIBSBcC2RpNnM9znFTNWcrp0aw1Y0lQ9fuM5p--2NDE61FmIz4OrKcLzFI5VqOCK6orHTJpx-XgP0uJ9CNXgT6ZWVq6qGbk8LtSlVhDZamDHwJZLT4E4xfSmm7Xwkw98TszFfYQYk809si_cFuxHcMRqpiWtz0lU7g0KqiD9tf2wcFrQMHCjwXDeajRDDfTnjbMtIoZ538_gA2m22h7aa5a-mocJRxxhNCUOBEoSoOVla8ZsJPVkqWRk5koY4fv01Gh_Y8KjbmFFDQSleU_Jna3ixYdcI9LB7cYqSWC-ga9tEfaCLnKHPC1xF3cYhf5HgbbJjZMsdDa3tDSjQGrZ_Q7fjj8MbTy_CzY6uTO8PENagemWSufKpNdfurA3MigKEYl5VX7SAJ2IrZBphgtMhCHgwnm_BtlUrSDlItwR4ilbTxUrDorCL-aeGy5QjaKQmS0Ctyj6vVXqE5esjygLcQPsizlnxwODrk68s6LB9qS4E4MjNGZa3saKAVWYXDzSzcjpzXFGSrsHhSOTJb8ThRjaaN4Bc-vroSVxmYFv5RkO21FJs3VHOM_ApCZ5tvoyMIzKuwJo4FEOjUh0HxWOejIH7677Tg4HnXXjOZRaLm-CWYeW8ATQ_B3IeQ5MXKu8MK1Ww4mF27XObfPzKzq-2El8yDa3_dyKShXsYwRYr51y6YULk5f3DyY7tskS9e7cRagQdMi7P0dc_s5zOpqR----uekQHlweEm1HNdSCG-yMu-wDQCwjZgfsRM041kDMWEVyiXePd9rrhMufmj_cQa88pdVqmgyzbsOdZOB7CgCUTUaaSKufMW84qZdBtPna5wQVhUf3hIEJztVR4cknOzRYH2hIwhhxY0reODXX02hIld2Mz3Gf9XReIwEvn8S59P8LAKCFVxCchffS09_om86EGoYadmXWSKfmQ798rKxnsErYF8IHOnjakNdzgjcnRHufw3BRs-k2LmVxOo9y0tJfcvfkWWmTiw2Kjxty-PWdMhXFSQcmYmnqKmII9pz_vIWHhr3C0EJqcvlCGZFGxoVmoDM9rIIa2wOnH7igyryjGEoia9WAadu5D4dGimrC2OE_E22qZmAC4OKSAqrmPIfKEQCIWUX6SBmz11amSfFOlOX1RsXbkYjBH-Jzc0Q5pWw7bHNImYuVjyvfTZ-mK9QMVyeGgDFTx0GMSSuPK9Ox6HyJpdvUbKoxV99YVrNlJ5C_sfH9sqE1h7vPqVsOi3o3wAQzsTB9UYF_7v1gjDY7hc7R3wz3QChztga2E0QdOabPHLa-BJAtA66lONQ-V85L9kuOF6h45n9EeWTPTpU2meh9aknqpDkNrw026zcXoIO3jvnovSluCyvSj2xGIS71CMGglyTJsNCdQdKKJyx39TbOcbRuc6FJN562DvcjSlBMHg7NiXcEm_D-8b-BQUYn4Aff1u3fvn0_AQ8JPLcqBnAtm4GAWztzLqTALzZb19m_WU-HCx9zQCfUt4DP5ZKGAC9-znSkfV4TARTUO04md3TEMU4WsQ3sy8Qg0khCQaxXGtrtN2yk8c6s9fNsBdoYnt1syPD6gRUOq-6TdrRVgRZW0htwUwWYxHKhN4uHa0s5XUVV6mqCN4dYouRyD4IUziu0i0j47CtuW8WdIWE7iBPiQRyz1xNMzKj1Lw2jRw-uGwohECl6ZhgTuSpgSipUcDwhI0PcpJmU4kHCzjdBVmP25Dw89GO7aCJkpNlWsxoT0nvcDgDCVnEdTcESVzU7u7EejK3D53moeV0bE212BFQU2hnU6V776wPe6NbLX_o5XvFuGbKHBMQFm0JcSOB6KUCHl8Xk_bV-1kFrm-vW78joYYUkTVwtOLfKCk5LHwIp5-tMtQ-73Y7JYTO2W9YSABTX8pSFEHUStd_9yfJ421zje9b2fW8en-JRoMY56NvHYRMQFOD0Nrfyk2oom2cB3-wG6FMgE6S96q0SpUjKMsBzPTQGAhKpQJQpMXxtRI1vgaARiglmCTzI7IuuzZ7BnCOueMg18wPEBU2DxH-xXIjcmPcVwlOGrpm63AmqyKTxOzT5Nuw1G7-aQIkcUSmBRZiWX2J9ZK2Qk1nNMtZAvYQ3dI5Po5a4Ea8OmUrkiJKCwgaczeBP3naZbY_TTyMCdvyHzmgflglttkM88rRpcAsj2NaHUfXSp7vXnAbJx23cPoGK5Nn8sRxhJSYwSIXbIQL7EJPp3Q41o5AyK9QagEq3DbLjCJg8d9Scj1mmlqlWGFGO7x1GB7eyEW6Z_ZpEUEPJXJr-bufr6VOSHQl8zUqTbikxLWeX1xxV2vos-HTCr0lBnfyMPx-_EeTBUCA2dDAWXKsZWIwi6LT5UFbk6YPkfk37zlz5L6KSJOr1mltUytVTXgE67mlxsg15bKL4t2q8YYAlmVzGXEOuHtBGbqeGNdyRF-VfIvor0wjshIKbnZoyB7l8CiN1fw6ZBE4r2h8dKw0k1K1le_ukDEB4hxbcIECFE_G8LY9s_vPxQCRGLd0U-AZMtgEm90dCJixbh6PjlXW_ptbwK6lQS-wT8T5dUQWM1vagigoKgmRs4sddSh0WLoFcHx9ww7ZxhVZPQli_zsbREu9ytiiONIRt7XsFYkHElGNWmmvCKZ2MElIFCwgSYgWHCRhLx-2RdP_zoM5Us0ZtCM7_80XAG-Wut99jFLt2lF9ShX2nzD5rSpwdZJG1_4vg93X36ochR0Tq5eHKIwgNAJRtBhjE0w-FWx4IF8H3_uihKb8xWqarOV2L8_oSfMFoJVGZfqK8fLPlQNSgwxDKBMqgyAAFHVjJ4by1KTYEnTltCLdX-oTg3BW1REsUHbtcvjiyE8NxFH3KYiCmmCPp8QRosoV8cG9eh0u3MG-UAxSSvM4nsY6vRDm_xytS3hSqGX1dnLAMJWlSiFiBikqTWXlq8iUhmYMX9T-x0X7wlHqRl1YvvFPSSyLg0Aw_9NO_8BUylp2NZBUQav3YCFt7ZMyXsrO5NYgsRtiFxDhfdQdLlyNS0jad8OEMe3Ns_GbN0D9TL06xotYV9u--lp4XsHKgVYzWleA3phsRnPaFWnZKwMMBIoHvvugJ8js5YqHVs9DcFalkz-_dEBJbq76JMR6pJxsh6L-kIoCsjesRMVqefzuB9TKUfDJyle8slrwMgx6TXvfFk0_Sfhe3r0jhN8CPsHwT9H5_voygp7IbcRFHAa9q8VIPycvL3keSgq4gW2srg8g4XSrZ74uG0Z-ttI6WLMIfvAN7SkXUhpBTgAfV3wVWuYwyzdcoq8QhU1j3PlDJ8AWmJuukGE6dPCkg_ic6JBO7D6BmFrYEC0LaWwn9rbbWDb8XBZA5GCdzZLJA3ZPyLsxIYFuRPym3_vw8fMdSNRF7vSC0i5UGJRosVTFCfgf2Ciuw1-6S_wT_-7mUg3hbiqnGYJaoYGgtGNkL1aPVdqkp8zctCzw96WDBBnk62WOLxx1bZbIlKRm3jzNFD1qCM5Y6goJVJCoKuQCknY_Enoo0dR9iJLFpa6qTIQ87MaI8dniWW0ICfZ2MOCdQ9CP_fpDyRCwBcgX0Ght7NO-TywqX9RtdRzf4YDMspfnFcrt4Lkbg_1BoA_LSB0DvyxU-NPzqS-Tc6MvnlvcxIKtDi2vpZKQ5rEnroz13gNbucIFzOitUdwGKDDtfXlnk5sFz0i1DpyaCubv1Dbnsw5wTyBb8w8tySU7MCG6II4360Nsl4MGYoPfKOOAsj61aK5od6kuDWPLWcvGxVfx2S6HvCZWHEiMPer6lEl8RcemzBAoPX2qxVJg-gSENnZ9xYPG5WKaMl9OA7diaT0VQ8KdfRlxt-FRibvmlRFhPL2aiE4nlMuqckI5VsfY6mOJawGNwGjzsH4bKSj4qmpp79NtrE9-dyeQiEGUj6kpJYfCA01FLdUgbXZ-7pT-i-BBzek4jr8n2At13wlirC_Kc1LwsM_8I_xvBR9C-bffFn_Jc1UNID0xmr-lSRmRULCoA2E9ZZcgBnk3xvDAM5lMbUkobFmX4xOOCfPv-RHTF_Nq5SnR631QWwTwmyl_NJTL8YpmD_0ujYU6Asfp30LEQ_KIKIanMAHknThfpW5L0kmFerCujh17Q3kp_lIn0IR2QWuHdrSSx-B9_rvw03qhZewaDTEPQS0t-cQY78Hm4H5VtIQMc2Hq32TbYiloJwfrEjeCyzLZICLLEs2RttKoDi61klexaJl2s-ger9t36DuBKXv3l3E2m1Dx0xsQ_bWIAiRAJrzh9Ah2JN1GweyGUpswWKpGooY7f5GgtwM_NZ-fpVxWa7WII7jK1Y9HJCyOheevQSnnUQK4_7dj5kk2tewXCvwuCpvZCoWfkmIq41hAwmMmOnvX6wSlh_hS0LyjOreVSDSuHaYyQmatH6qlfW6yyvLppQ49g2JpCvBDjKIm60Sgn0-iHp7uJh67LfBYnT-nTM6n2JApntUQSdm4_dauov4-WZWL_LY_FhnuvlpiRwB9IffKL0rApdC5EpF0NftDFPg8X043hG2bbuSrDroP3NdsfARotYqlaogPEMiQp7OC8EoX8JFoKDIdt595Ss5MijnXlrm3_zvcRTcrrWNpVKk4OEghvv_w5EF0Za1At4XW_7nHRz9YW-0KGjNx0-96YqHz2eqRT1iBzAlH-R_HMVoiwksi6NMT3m2PMzft2FzuFG-McFfDeB0wm5FgLXyt5V8cXGIgrmxYTB0VqpkGwwXZDrG4d4mI36OCUD9lskaT81J8ELU_Io6HbUlA9zrq8vKtppyjbtOYp4qTK9A5Op-dj-mKZ_ijg0NUy23_FmeN5Xq-xYFif4DMSFc2pJZ7bR9dALX5xFh11lA8KG1UuELHjFoQtXYrTT6D6jiaf5Nulni_SscK_UHaMOhL7wftAWeBCu2_Tnsu4qWUAl31eiPexe62f0zavNIL_Uwfg17Ci4K8G4-nbG7BaxdrbVunnNeLtPm4ElAi8WxKBsqlv-U8QV5H7FS8mBLYa6Yq0QAGBdyz-LoP2Mtixh_8MOkD-fqDA4Og2g1t0XQ3pFxzaUBc5oMgtV2N50DmtOWnKtsaoWMH47pXMvh6Mqtvm04Fr_tXMotnyYcmRqSkBi2Fz8XcIahbb02iMILNb0BWgf8HovmhEoxgV6ONrQydZWQLlZ4siY3EhoLduT-G17iYQsSR2DpFGARWIcIMUflo92HefIEFdJS7OWZqkbRt3P3K1W10CtWO33Hjv5IXSbHLtiasg8gA9LPLU2vk-AfYVcK1YTp2wSIL4p0V_0k11ZSCYp-TARBFWekbP_ON0n4_YC6sAJydQ1xSI69TLusLaZp5G7b-mJJ51jWoD2oDkXZxV8ctLMhXbIpOYlryJQclcklTUOHjEJkr1Olw_raBF_xSg22887mBvDtsu0Q8_74E_EsIdIMiEZOI5Xlw6s-rCOQgnjcmk9sHKgxR9Qv2VKve7azy5-ZhqzuLpBiIUGb595brmemHPdxOOQh0Vja7HzyFAtPJ2nmWOM8H2uwedAaJIGWrexOekG1ZRJ0Bi2ShbsNtIQThXaB-Z38ldWxWUooVGiQ8ZBsRx3qJySjiObOasLqrrzPXOlkcaVtHVaSMXvxsWlwcYlqQq0DjVoDjE-bwseJAl2p7Pp4n_XsCvoiwwOT-5h0i0TLWbsXv3fG3wtBFR0osd9d_OZ5-0ZsxZz-4V5-gVa4qUYO1JDyZ9yRs4CM4d9dy3LR_A5QK1GFl2u_L7Ig4fouwqnjj_nOcYDjZLCUVK3TlwNhJ1BgCdi4kYflAelD3By5qMMB09zWJ8pjDcLbrcN2UacMF-agGmNCAB23xznN3xZKhe0S8Ii3iGJO5Chg0NXMFsjI1swxoM2NQbig8G082lrt43EGueEQma3diueWCiK_K0tIpptFPkRP28SoMsYvNKQLrqIFl3j5LCSpLbnB1_30Br-5DL0y2aDMaLPzb6G7a_0c1O8NofAOmCO4qhilVCzf60csbkgP48JKCSUe520QPQbDLn2wjYMa4wAeVA0UW-NXnKVU1mnhwhAjvBek4tmmQTHwqrzOyb14D6iuTrPiVrQJxdqM2XrFqX_-gDyCvVJSjVp3RkQczApTGNDe2eKjrwglKt0r69Gfn26haHhJxL8EYk7R6eyVDrDSZj10uDvdmFTw2McC2LsAcG1C_z6d9Jyqe4R8ddX3sdN-cTmCBLMgYOaW1emaHgQFg-XSiSQTfXxKm4zVR0kXrujCuDTevKFAWwlBWSmAWPCs2yAqR8XSrSz3iBfj16v3Wsxh6GyxMCoj0voKnQ55wpLMbhgmAUcYz9QM9btkkROfZ-lNkoeyOiqof6Vr2DOTdFhZY7-N1Jpr1a3Gt3urzRbwfFM84M4FMep2uFfhdsJvKwnFG3ynBElaimfOEDU559mxcDYfmesg_IniFUdcupqAUYFUqhfx14ZcELZBhIfPgCmZNmksDHnFsBZPnnxWil3krWsSV6yWGNdP_vBt2GFsrQbMcbbuvssn1R9zSAgE1cGG4eaw2M2diWVRyFGkd6UfsuEw7wy0XGr42GboxoY3PZt7RY6OjbifaEreCzqFKMT-1t49qSDMgeaHg6W738HvJcxkcUKpx0g8g4P4dHaHzCPwg_15Aw2-tJEt0oPG4wDw36-QAv-vbgWfeVZnLMmHyFdzYGEqQVQpHOk_SVRDN_bMv7dlldDONRlqSnprgO4oMxaGfUrnRGtXR5L4GaB5CrYZz7Y-fxBrjIV5mkf_USk6b8y6h9ynsmAghcmp_ByohLDeYz38chkYfJIw-dM10foLpzjqkDgzfQE5hj2GZ_Ebag_OMQdPlG9k2tIdH5Ldu_oe7BY2-HmvkIURAIKCkUEHFuK3_JxtLzKSYi5zJ5tZb9iETJYDtPIJ-JMQWiSnqMXZCGaLOoKvhNsn5Ur3Fd3NFZ-Vj3-otFK-qaEvylOOuQ3H7T783IbxiJz684tKQy5zenVxgMwaYB5YFrPAES3-GpbejRWasSM5nZM-wjySEBq6tZ0mU3JCaHcgXd3h_k8tUKvHrjNTRRE2bAITxGQZ2latGmlgNXg2FPnZQTnVwQGjGYZu9cFzKgl1XfbtQhEQGG0XKaJcIrJ-l34h0nVPlhgSAQTwp7c_LvxdVY6-CspmTHZCgXomMK8jaRyfcbnHQlZ_Teh8JP-h8uTPetrj9tstzUp7JLJuLd45evjkqmurm1cs5LFSnKMDNbFcWleIwdUKW8kmtIaH-24IMwECDANvHMG6-jeplqm82xyWbPr0FZg9qe0LiYPGyHIShiCag9KYaHvn5TCmVBQIFftVq4cFJ_irjI6gIEb2E07XpSQpmfYLl5w_hq-KAJU2pnJBRwPVBua2DDKMup_n2r1nBNXqY4xRl5IU5VRJyCWbVY9Tpb125BFb5FNmMOKt6rYMs5hHNTFJ5jwD6BylmA2DavdFH0KUQB3HSMeqJDIIJVSIlAJDPmeOcKMvdCWV6ZDTHaAQ_9yL8_JnVFKaTpQUrDBQ8Dr7NDAcZAGoAETCSA4tTq9Hbf4XuH1zXOJY5eGtt28HriR8txKnkRSYx2zzt2TNRHAUfT9EmMmDl499W0aixWxS6HM0ihKX_i0Y8IqHa0ElOQVujOnLpTaAi1iLgJtW-EIOh7Rt1kkdBjkHhkTg6u9glVvKX9PTGGxhhJfzNS257_hhPxzFn9c-XecbiBZfx_cgENqOk7yQi6CeJajzxMKehESp4cpN2PXN-YbkeJO7vNgfJIZYJOlIJNhp-Mf8JdiIQ0qY18ifwceeBl6YBvzeaIL1I7uK7tBne6QMiH5O2CfI6N92dNK_5XRiO9s7gK_8l_0-eYG2dl8cca84mamsBgvYlXPPEnEH-7_EERhzZ3uIlMMXqsVe2JotvqZvtOIk0Nbd4iurvpFv2vaHnSS1As0acMgk0v02QqZM-rSQpu5pzaSjSFaAxXA6j4oB87k-kfke1pjvGf-herXc9yo1sF9dVXn5mwBgsO0UNUYSdXLk-RendmE1F6JlC7yqw9DSoU8QnH8tRA8SDYtZQ5gaZIrHPtH8JK68_fIBPnyljLgvhzs22rfAGJNbwnUDGfQWfmK71-lGubJtpfh38k3t6wUsLk_tz-jD2DnwaBSufcAHOoZg-NDqwStEhfhesrYQtn8QnpVJ8NATSEoP8MoqymBBT0DKW-DSo2hEHsN66fWHpUWTl68-t3Bj8lTNWjRYfyTvvdR0hnisZwOwj1PIsKHNP0W0xohWBb2cRRvV6hYyALQ5AfxYuNvt2b1SpOhTuz_nEaXgW8FpbsjPfAQjpEiaMMNTCaCbz33_hnfe2aQpxDSIpxgE85HXtsJXaaTjl5GSf21YItE7_8s94TwhVDAKNpqcP4yks2YGGhIhlZraVlEQA4SbB_9zhvxG9Ae4ebm-UpP0JXuTLo0-nJTsWFFEFN1B7eKeLiv5G8rbN8nLF3Rz0H5slZb5tCQm8IJtMcPsu781fWcy0mp2vrf7duckPDXeiZ3n6kzx9Xv1UtmTO1IeeUbePvaE83AJj6t79NWYSgLUqw0otU41fwNiD8qQJNgON5TW_IAsMzbPJmNyQZpgkVujUl8VjVtOuKnstlBtx-uTdR6woX8iT9IYfcL6W7Oh2JXKGXlPHReXxK3_iXx56fh4qVtwE5zmc1522TWeGXiQqbt9y7V2C0fE7lh3AnJ1B2PRBysyfmmPT6yH7LjXYOYLUBjKIypVElMLbwa-ESQnE7RoylWqxY51e38chhaFzknZyV7DSIO_Kh1a7XwSKEHmRJID8qy1dPOOsMzgV3Ajb2K7IJ3_axpwNrpiCCNuW8NBZrAGZg_ncQmd4QfKgXIm1FA3UvKwZp4oJxoBmOtIJ2jBgDcT0sS8C0R2RJN3DW8t7gkZ526v6VoUFX97R3ZQUBVu9Nc3YJIdSMdrJhsaMgLNvBOI4cJVJ6BOfRE6i1oxlTbPXYn6UA6l0gPCmKjXFTn5RX30vJnNX_MITJtaJ1F4_8LZiotWK6WxqV50Qbst5KfF1h62_jSJNMkKMEdumtgWNpRczCXaN-tb4tilYfMWXE1NfuzRXB7F2Z4tecdRUbO1gcJTMPeaI1ziKxndkXx_A8lfkoaPg7r7AtrY7ysP8GnMJbpyhqAlWXFLzGPcX6u3H5Zzcecm4O8hrMdJUYD-JMgP8OSfMAv9Zv86CRGJuZ_yM0L5keFSI4d1UZpr7QP5LmPiXdMmP90q3xzolkHKc1nIYjaFlXxydDD3BC1Nu2TE3Wnp40xyELqXIC8kqJh9DlzlwoHc5MhXu4oCxed36GWCI23zxCSs5NSLLipLODSjqKF4_Qs1P8tfx771ch1n4MHTXcyOAgudLb7VuF8LmQeceLYF4Ubq0vLYpUb6BDoOHkQsjvt58FwEQe4GptYOglAoQ9hz7TVin7G2yUIto6DPhPwPPPhpWc449F4EvurP8iwLgqY8PhlqVSY_Vsa1zMDwOBtTtIPmSyKYfT5lCIFsK24FUny6ysgPkH5dogcRsiV7OwTmHCYs_BGsnlzJCqmmThAKqLCKsl9iocp1-51PMiY9WSV3Euzk2v1a6osSwPRGo4SjfHVfbwwGmhITqVBz4MeUS3z_SdsNx0LhHYVkOkyKNAg205ePOgpNVJeQk13iw1yCRLYdEYmmyliuApLRkbpFYbFx7Ehb-it4DLmJQrjtFmOwHg4S4iI4pZlGXfT58zxK4unbSpWuGCbGXYwwJwsGrZI6vDypc4QJqzpHP919OHaib6E6ShS2lD10U9dCEyLx2ZSsNi5ccit2kd";

        byte[] input = Base64.decode(base64String, 10);
        DvmObject<?> result = FenEncryptUtils.callStaticJniMethodObject(emulator, "heracles([BII)[B", input, 9, 0);
        byte[] resultByte = (byte[]) result.getValue();
//        String resultStr = new String(resultByte);
//        System.out.println(resultStr);
        return new String(resultByte);
    }

    public String achilles(String data) {

//        byte[] input = "{\"is_all\":\"1\",\"keywords\":\"科比6青蜂侠反转\",\"page\":\"1\",\"page_size\":\"20\",\"rid\":\"\",\"scene\":2,\"scene_type\":\"95fen_android_search_personal\",\"search_from\":\"main_search\",\"sn\":\"SearchList\"}".getBytes(StandardCharsets.UTF_8);
        byte[] input = data.getBytes(StandardCharsets.UTF_8);
        DvmObject<?> result = FenEncryptUtils.callStaticJniMethodObject(emulator, "achilles([B)[B", (Object) input);
        byte[] resultByte = (byte[]) result.getValue();
        return Base64.encodeToString(resultByte, 10);
//        System.out.println("dddd--->" + Base64.encodeToString(resultByte, 10));
        // M0NDRTRBQjk0ODRCQzM1MDlEOUQzODBCNEUzNEY5QTQuY0dGeVlXMGZOakl5Wm1RNU56QXROamMyT1MwME5qRmlMVGcwWWprdE1qTTVOV0ZsT0RrM1pUazNIblpsY25OcGIyNGZNUjV3YkdGMFptOXliUjloYm1SeWIybGtIbVZqSHpFPS5ltJ5ORjWnGTBl8IB7WS5VDdTbibi_-WDzS_oeJySG4p1OQ_iNhzZujTpayiyDNFbl911-cTgp4W2TsLQXm18hCnUMxgt7-OFhfVk8I3rR9gLkKR_XWjPq0o_e6HKfxz8XWmrLXFqlkv_4KLnGAY9YnwPNabjJZx_khsOP9583Lf86yi-eqqb7qObDbYIDXB8R71030N2j4ihdckZ9rogjvjXBW2-wGkY-xq6xl4eRgoRcq5sl7fdlfpcmnDPesM4=
    }

    @Override
    public DvmObject<?> callObjectMethod(BaseVM vm, DvmObject<?> dvmObject, String signature, VarArg varArg) {
        switch (signature) {
            case "android/app/ActivityThread->getApplication()Landroid/app/Application;": {
                return vm.resolveClass("android/app/Application").newObject(null);
            }
            case "android/app/Application->getPackageManager()Landroid/content/pm/PackageManager;": {
                return vm.resolveClass("android/content/pm/PackageManager").newObject(null);
            }
            default:
        }
        return super.callObjectMethod(vm, dvmObject, signature, varArg);
    }

    @Override
    public DvmObject<?> callStaticObjectMethodV(BaseVM vm, DvmClass dvmClass, String signature, VaList vaList) {
        switch (signature) {
            case "android/app/ActivityThread->currentActivityThread()Landroid/app/ActivityThread;": {
                return dvmClass.newObject(null);
            }
        }
        return super.callStaticObjectMethodV(vm, dvmClass, signature, vaList);
    }

    @Override
    public DvmObject<?> callStaticObjectMethod(BaseVM vm, DvmClass dvmClass, String signature, VarArg varArg) {
        switch (signature) {
            case "android/app/ActivityThread->currentActivityThread()Landroid/app/ActivityThread;": {
                String packageName = vm.getPackageName();
                if (packageName != null) {
                    return vm.resolveClass("android/app/ActivityThread").newObject(null);
                }
            }
            default:
        }
        return super.callStaticObjectMethod(vm, dvmClass, signature, varArg);
    }

}
